// 菜单. 默认的菜单并不好看, 好看的可参考DrawMenu例子, 但那个不熟练的话又不好理解.
// 用无边框窗口里放按钮来做菜单会更方便美化, 也比自绘好理解一些, 也是一个常用的做法.
package main

import (
	"fmt"
	wapi "gitee.com/go_888/xcgui/xcgui/wapi"

	app "gitee.com/go_888/xcgui/xcgui/app"
	widget "gitee.com/go_888/xcgui/xcgui/widget"
	window "gitee.com/go_888/xcgui/xcgui/window"
	xc "gitee.com/go_888/xcgui/xcgui/xc"
	xcc "gitee.com/go_888/xcgui/xcgui/xcc"
)

var (
	a   *app.X结构_全局API
	w   *window.Window
	btn *widget.X结构_按钮

	item_selected = true // 控制item_select是否选中
)

const (
	item1 = iota + 10000
	subitem1
	subitem2

	item2
	item_select
	item_disable
)

func main() {
	// 1.初始化UI库
	a = app.X创建(true)
	a.X启用DPI(true)
	a.X启用自动DPI(true)
	// 2.创建窗口
	w = window.X创建窗口(0, 0, 400, 300, "Menu", 0, xcc.X窗口样式_默认样式)

	// 创建一个按钮
	btn = widget.X创建按钮(50, 50, 100, 30, "ShowMenu", w.X句柄)
	// 注册按钮被单击事件
	btn.X事件_被单击(onBnClick)

	// 注册菜单被选择事件
	w.X事件_菜单选择(onMenuSelect)

	// 注册菜单弹出事件
	w.X事件_菜单弹出(onMenuPopup)

	// 注册菜单退出事件
	w.X事件_菜单退出(onMenuExit)

	// 3.显示窗口
	w.X显示方式(xcc.SW_SHOW)
	// 4.运行程序
	a.X运行()
	// 5.释放UI库
	a.X退出()
}

// 按钮被单击事件
func onBnClick(pbHandled *bool) int {
	// 创建菜单
	menu := widget.X创建菜单()
	// 一级菜单
	menu.X添加项(item1, "item1", 0, xcc.X菜单项标识_正常)
	menu.X添加项(item2, "item2", 0, xcc.X菜单项标识_正常)
	if item_selected {
		menu.X添加项(item_select, "item_select", 0, xcc.X菜单项标识_勾选)
	} else {
		menu.X添加项(item_select, "item_select", 0, xcc.X菜单项标识_正常)
	}
	menu.X添加项(-1, "", 0, xcc.X菜单项标识_分隔栏) // 分隔栏
	menu.X添加项(item_disable, "item_disable", 0, xcc.X菜单项标识_禁用)

	// item1的二级菜单
	menu.X添加项(subitem1, "subitem1", item1, xcc.X菜单项标识_正常)
	menu.X添加项(subitem2, "subitem2", item1, xcc.X菜单项标识_正常)

	// 获取按钮坐标
	var rc xc.X结构_矩形
	btn.X取窗口客户区坐标DPI(&rc)
	// 转换到屏幕坐标
	pt := wapi.X坐标{X: rc.X左, Y: rc.X下}
	wapi.X客户区坐标转换屏幕坐标(w.X取HWND句柄(), &pt)
	// 弹出菜单
	menu.X弹出(w.X取HWND句柄(), pt.X, pt.Y, 0, xcc.X菜单弹出方向_左上角)
	return 0
}

// 菜单被选择事件
func onMenuSelect(nID int32, pbHandled *bool) int {
	fmt.Println("菜单被选择:", nID)
	if nID == item_select {
		item_selected = !item_selected
	}
	return 0
}

// 菜单弹出事件
func onMenuPopup(HMENUX int, pbHandled *bool) int {
	fmt.Println("弹出菜单")
	return 0
}

// 菜单退出事件
func onMenuExit(pbHandled *bool) int {
	fmt.Println("菜单退出")
	return 0
}
